 /*******************************************************************************
  * Copyright (c) 2000, 2006 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
  *
  * Contributors:
  * IBM Corporation - initial API and implementation
  *******************************************************************************/
 package org.eclipse.ui.internal.dialogs;

 import java.util.StringTokenizer ;

 import org.eclipse.jface.viewers.IStructuredSelection;
 import org.eclipse.jface.wizard.IWizard;
 import org.eclipse.jface.wizard.Wizard;
 import org.eclipse.ui.IWorkbench;
 import org.eclipse.ui.internal.IWorkbenchGraphicConstants;
 import org.eclipse.ui.internal.WorkbenchImages;
 import org.eclipse.ui.internal.WorkbenchMessages;
 import org.eclipse.ui.internal.WorkbenchPlugin;
 import org.eclipse.ui.wizards.IWizardCategory;
 import org.eclipse.ui.wizards.IWizardDescriptor;

 /**
  * The new wizard is responsible for allowing the user to choose which new
  * (nested) wizard to run. The set of available new wizards comes from the new
  * extension point.
  */
 public class NewWizard extends Wizard {
     private static final String CATEGORY_SEPARATOR = "/"; //$NON-NLS-1$

     private String categoryId = null;

     private NewWizardSelectionPage mainPage;

     private boolean projectsOnly = false;

     private IStructuredSelection selection;

     private IWorkbench workbench;

     /**
      * Create the wizard pages
      */
     public void addPages() {
         IWizardCategory root = WorkbenchPlugin.getDefault().getNewWizardRegistry().getRootCategory();
         IWizardDescriptor [] primary = WorkbenchPlugin.getDefault().getNewWizardRegistry().getPrimaryWizards();

         if (categoryId != null) {
             IWizardCategory categories = root;
             StringTokenizer familyTokenizer = new StringTokenizer (categoryId,
                     CATEGORY_SEPARATOR);
             while (familyTokenizer.hasMoreElements()) {
                 categories = getChildWithID(categories, familyTokenizer
                         .nextToken());
                 if (categories == null) {
                     break;
                 }
             }
             if (categories != null) {
                 root = categories;
             }
         }

         mainPage = new NewWizardSelectionPage(workbench, selection, root,
                 primary, projectsOnly);
         addPage(mainPage);
     }

     /**
      * Returns the id of the category of wizards to show or <code>null</code>
      * to show all categories. If no entries can be found with this id then all
      * categories are shown.
      *
      * @return String or <code>null</code>.
      */
     public String getCategoryId() {
         return categoryId;
     }

     /**
      * Returns the child collection element for the given id
      */
     private IWizardCategory getChildWithID(
             IWizardCategory parent, String id) {
         IWizardCategory [] children = parent.getCategories();
         for (int i = 0; i < children.length; ++i) {
             IWizardCategory currentChild = children[i];
             if (currentChild.getId().equals(id)) {
                 return currentChild;
             }
         }
         return null;
     }

     /**
      * Lazily create the wizards pages
      * @param aWorkbench the workbench
      * @param currentSelection the current selection
      */
     public void init(IWorkbench aWorkbench,
             IStructuredSelection currentSelection) {
         this.workbench = aWorkbench;
         this.selection = currentSelection;

         if (projectsOnly) {
             setWindowTitle(WorkbenchMessages.NewProject_title);
         } else {
             setWindowTitle(WorkbenchMessages.NewWizard_title);
         }
         setDefaultPageImageDescriptor(WorkbenchImages
                 .getImageDescriptor(IWorkbenchGraphicConstants.IMG_WIZBAN_NEW_WIZ));
         setNeedsProgressMonitor(true);
     }

     /**
      * The user has pressed Finish. Instruct self's pages to finish, and answer
      * a boolean indicating success.
      *
      * @return boolean
      */
     public boolean performFinish() {
         //save our selection state
 mainPage.saveWidgetValues();
         // if we're finishing from the main page then perform finish on the selected wizard.
 if (getContainer().getCurrentPage() == mainPage) {
             if (mainPage.canFinishEarly()) {
                 IWizard wizard = mainPage.getSelectedNode().getWizard();
                 wizard.setContainer(getContainer());
                 return wizard.performFinish();
             }
         }
         return true;
     }

     /**
      * Sets the id of the category of wizards to show or <code>null</code> to
      * show all categories. If no entries can be found with this id then all
      * categories are shown.
      *
      * @param id may be <code>null</code>.
      */
     public void setCategoryId(String id) {
         categoryId = id;
     }

     /**
      * Sets the projects only flag. If <code>true</code> only projects will
      * be shown in this wizard.
      * @param b if only projects should be shown
      */
     public void setProjectsOnly(boolean b) {
         projectsOnly = b;
     }
     
     /* (non-Javadoc)
      * @see org.eclipse.jface.wizard.IWizard#canFinish()
      */
     public boolean canFinish() {
          // we can finish if the first page is current and the the page can finish early.
 if (getContainer().getCurrentPage() == mainPage) {
                 if (mainPage.canFinishEarly()) {
                     return true;
                 }
             }
             return super.canFinish();
     }
 }

